Amazon Elastic Transcoder メディア変換サービス来た!
Amazon Elastic Transcoderとは
AET(Amazon Elastic Transcoder)は、映像・音声をユーザーが再生可能なフォーマットに変換するクラウドサービスです。
入出力の形式
重要だと思ったので最初に言いますが、入力形式としてサポートしている動画フォーマットは、3GP, AAC, AVI, FLV, MP4です。出力形式としてサポートしている動画フォーマットは、H.264/AAC/MP4です。音声データは、2-channel AACです。サンプルレートやビットレートは変更可能です。
変換可能な形式(プリセット)一覧
AETが変換可能なメディア形式は以下になります。これらはよくある形式として最初から登録されています。この他にも自分でエンコード形式を定義することも可能です。
- System preset generic 1080p
- System preset generic 720p
- System preset generic 480p 16:9
- System preset generic 480p 4:3
- System preset generic 360p 16:9
- System preset generic 360p 4:3
- System preset generic 320x240
- System preset: iPod touch 5G, 4G, iPad 1G, 2G
- System preset: iPhone 5, iPad 3G, 4G, iPad mini, Samsung Galaxy S2/S3/Tab 2
- System preset: iPhone 3GS
- System preset: iPhone 1, 3, iPod classic
- System preset: Apple TV 2G
- System preset: Apple TV 3G, Roku HD/2 XD
- System preset: Facebook, SmugMug, Vimeo, YouTube
- System preset: Kindle Fire HD
- System preset: Kindle Fire HD 8.9
- System preset: Kindle Fire
メディアファイルのアップロード
AETは、S3にアップされたメディア生データをユーザの環境に合わせて鑑賞できるように変換してくれます。ですから、まずはS3にメディアをアップしておいてください。
パイプラインの作成
一連の流れを確認してみましょう。まずはAWS管理コンソールからAmazon Elastic Transcoderを選択します。
AETは、パイプライン、ジョブ、プリセットの3つの部品からできています。
パイプラインの作成時は、入力元となるS3バケットと出力先となるS3バケットを指定します。
このとき、パイプライン内で起こったイベントをSNS通知するかオプション指定することもできます。
作成が完了したら詳細を見てみましょう。
ジョブの作成
続きましてジョブの作成に移ります。パイプライン名を指定した後に、プリセットを指定します。これは、変換形式の指定です。あらかじめたくさん用意されていますので選択しましょう。
進捗の確認
作成したジョブは確認画面から検索することができます。パイプラインIDやステータスから検索することができます。
パイプライン作成時にSNS通知を追加しておけばステータスが変更されたタイミングでSNSにメッセージが飛びます。SNSに購読者としてメールアドレスを登録しておけば以下のようなメッセージが飛んできます。
{"state":"PROGRESSING","jobId":"135942142341086-5d5607","pipelineId":"1234448208018-6eb5e6","errorCode":null,"messageDetails":null}
出来上がり
出来上がり〜♪といきたいところですが、、、、以下のように変換に失敗することもあります。入力メディアの形式に制限があることを忘れていましたw。(ブログの最初に追記しましたw)
色々調べていたら入力メディアのフォーマットが対応外でしたw。そこで、改めて対応しているフォーマットのメディアをアップして再度実行してみましょう。
おそらくうまく行っているはずです。結果は明日!
AWS SDK for Javaから操作する
お決まりパターンですが、Javaから操作するサンプルを作ってみました。
import java.util.List; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.ClasspathPropertiesFileCredentialsProvider; import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoder; import com.amazonaws.services.elastictranscoder.AmazonElasticTranscoderClient; import com.amazonaws.services.elastictranscoder.model.CreatePipelineRequest; import com.amazonaws.services.elastictranscoder.model.CreatePipelineResult; import com.amazonaws.services.elastictranscoder.model.Job; import com.amazonaws.services.elastictranscoder.model.JobInput; import com.amazonaws.services.elastictranscoder.model.JobOutput; import com.amazonaws.services.elastictranscoder.model.ListJobsByPipelineRequest; import com.amazonaws.services.elastictranscoder.model.ListJobsByPipelineResult; import com.amazonaws.services.elastictranscoder.model.ListPipelinesRequest; import com.amazonaws.services.elastictranscoder.model.ListPipelinesResult; import com.amazonaws.services.elastictranscoder.model.ListPresetsRequest; import com.amazonaws.services.elastictranscoder.model.ListPresetsResult; import com.amazonaws.services.elastictranscoder.model.Notifications; import com.amazonaws.services.elastictranscoder.model.Pipeline; import com.amazonaws.services.elastictranscoder.model.Preset; public class AmazonElasticTranscoderSample { static AmazonElasticTranscoder transCoder; private static void init() throws Exception { AWSCredentials credentials = new ClasspathPropertiesFileCredentialsProvider().getCredentials(); transCoder = new AmazonElasticTranscoderClient(credentials); transCoder.setEndpoint("https://elastictranscoder.ap-northeast-1.amazonaws.com"); } public static void main(String[] args) throws Exception { init(); CreatePipelineRequest createPipelineRequest = new CreatePipelineRequest(); createPipelineRequest.setName("hogehoge"); createPipelineRequest.setInputBucket("input.akari7.net"); createPipelineRequest.setOutputBucket("output.akari7.net"); Notifications notifications = new Notifications(); notifications.setWarning("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample"); notifications.setProgressing("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample"); notifications.setError("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample"); notifications.setCompleted("arn:aws:sns:ap-northeast-1:7712XXXXXXXX:topic-sample"); createPipelineRequest.setNotifications(notifications); createPipelineRequest.setRole("arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role"); CreatePipelineResult createPipelineResult = transCoder.createPipeline(createPipelineRequest); Pipeline p = createPipelineResult.getPipeline(); System.out.println("----------New Pipeline----------"); System.out.println("Id : "+p.getId()); System.out.println(" Name : "+p.getName()); System.out.println(" Status : "+p.getStatus()); ListPipelinesRequest listPipelineRequest = new ListPipelinesRequest(); ListPipelinesResult listPipelineResult = transCoder.listPipelines(listPipelineRequest); List<Pipeline> pipelines = listPipelineResult.getPipelines(); System.out.println("----------Pipeline List----------"); for (Pipeline pipeline : pipelines) { System.out.println("Id : " + pipeline.getId()); System.out.println(" Name : " + pipeline.getName()); System.out.println(" Role : " + pipeline.getRole()); ListJobsByPipelineRequest listJobsByPipelineRequest = new ListJobsByPipelineRequest(); listJobsByPipelineRequest.setPipelineId(pipeline.getId()); ListJobsByPipelineResult listJobsByPipelineResult = transCoder.listJobsByPipeline(listJobsByPipelineRequest); List<Job> jobs = listJobsByPipelineResult.getJobs(); for(Job job : jobs){ System.out.println(" Id : "+job.getId()); JobInput jobInput = job.getInput(); System.out.println(" JobInput"); System.out.println(" AspectRatio : "+jobInput.getAspectRatio()); System.out.println(" Container : "+jobInput.getContainer()); System.out.println(" FrameRate : "+jobInput.getFrameRate()); System.out.println(" Interlaced : "+jobInput.getInterlaced()); System.out.println(" Key : "+jobInput.getKey()); System.out.println(" Resolution : "+jobInput.getResolution()); JobOutput jobOutput = job.getOutput(); System.out.println(" JobOutput"); System.out.println(" Key : "+jobOutput.getKey()); System.out.println(" PresetId : "+jobOutput.getPresetId()); System.out.println(" Rotate : "+jobOutput.getRotate()); System.out.println(" Status : "+jobOutput.getStatus()); System.out.println(" StatusDetail : "+jobOutput.getStatusDetail()); System.out.println(" ThumbnailPattern : "+jobOutput.getThumbnailPattern()); } } System.out.println("----------Preset List----------"); ListPresetsRequest listPresetsRequest = new ListPresetsRequest(); ListPresetsResult listPresetsResult = transCoder.listPresets(listPresetsRequest); List<Preset> presets = listPresetsResult.getPresets(); for (Preset preset : presets) { System.out.println("Id : " + preset.getId()); System.out.println(" Name : " + preset.getName()); System.out.println(" Description : " + preset.getDescription()); System.out.println(" Type : " + preset.getType()); System.out.println(" Thumbnails : " + preset.getThumbnails()); System.out.println(" Video : " + preset.getVideo()); System.out.println(" Audio : " + preset.getAudio()); } } }
実行結果は以下のような感じです。
----------New Pipeline---------- Id : 1359476482173-42ee2a Name : hogehoge Status : Active ----------Pipeline List---------- Id : 1359448208018-6eb5e6 Name : sample1 Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role Id : 1359461290399-ac592b JobInput AspectRatio : auto Container : auto FrameRate : auto Interlaced : auto Key : movie.mp4 Resolution : auto JobOutput Key : movie.mov PresetId : 1351620000000-100030 Rotate : auto Status : Error StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure. ThumbnailPattern : null Id : 1359459891086-5d5607 JobInput AspectRatio : auto Container : auto FrameRate : auto Interlaced : auto Key : movie.mov Resolution : auto JobOutput Key : movie.mpg PresetId : 1351620000000-100030 Rotate : auto Status : Error StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure. ThumbnailPattern : null Id : 1359449690967-43c78b JobInput AspectRatio : auto Container : auto FrameRate : auto Interlaced : auto Key : movie.mov Resolution : auto JobOutput Key : movie.mpg PresetId : 1351620000000-100070 Rotate : auto Status : Error StatusDetail : 9999: Amazon Elastic Transcoder encountered an internal failure. ThumbnailPattern : null Id : 1359475647523-80c6a2 Name : hogehoge Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role Id : 1359476482173-42ee2a Name : hogehoge Role : arn:aws:iam::7712XXXXXXXX:role/Elastic_Transcoder_Default_Role ----------Preset List---------- Id : 1351620000000-000001 Name : System preset: Generic 1080p Description : System preset generic 1080p Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5400, FrameRate: 29.97, Resolution: 1920x1080, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, } Id : 1351620000000-000010 Name : System preset: Generic 720p Description : System preset generic 720p Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2400, FrameRate: 29.97, Resolution: 1280x720, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, } Id : 1351620000000-000020 Name : System preset: Generic 480p 16:9 Description : System preset generic 480p 16:9 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1200, FrameRate: 29.97, Resolution: 854x480, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, } Id : 1351620000000-000030 Name : System preset: Generic 480p 4:3 Description : System preset generic 480p 4:3 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 900, FrameRate: 29.97, Resolution: 640x480, AspectRatio: 4:3, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, } Id : 1351620000000-000040 Name : System preset: Generic 360p 16:9 Description : System preset generic 360p 16:9 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 720, FrameRate: 29.97, Resolution: 640x360, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, } Id : 1351620000000-000050 Name : System preset: Generic 360p 4:3 Description : System preset generic 360p 4:3 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 600, FrameRate: 29.97, Resolution: 480x360, AspectRatio: 4:3, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 128, Channels: 2, } Id : 1351620000000-000060 Name : System preset: Generic 320x240 Description : System preset generic 320x240 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=1.3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 300, FrameRate: 15, Resolution: 320x240, AspectRatio: 4:3, } Audio : {Codec: AAC, SampleRate: 22050, BitRate: 64, Channels: 2, } Id : 1351620000000-100010 Name : System preset: iPhone4 Description : System preset: iPod touch 5G, 4G, iPad 1G, 2G Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100020 Name : System preset: iPhone4S Description : System preset: iPhone 5, iPad 3G, 4G, iPad mini, Samsung Galaxy S2/S3/Tab 2 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=high, Level=4.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100030 Name : System preset: iPhone3GS Description : System preset: iPhone 3GS Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 600, FrameRate: 30, Resolution: 640x480, AspectRatio: 4:3, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100040 Name : System preset: iPod Touch Description : System preset: iPhone 1, 3, iPod classic Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x144, AspectRatio: 4:3, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=baseline, Level=3}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1500, FrameRate: 30, Resolution: 640x480, AspectRatio: 4:3, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100050 Name : System preset: Apple TV 2G Description : System preset: Apple TV 2G Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100060 Name : System preset: Apple TV 3G Description : System preset: Apple TV 3G, Roku HD/2 XD Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=high, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5000, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100070 Name : System preset: Web Description : System preset: Facebook, SmugMug, Vimeo, YouTube Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 44100, BitRate: 160, Channels: 2, } Id : 1351620000000-100080 Name : System preset: KindleFireHD Description : System preset: Kindle Fire HD Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 2200, FrameRate: 30, Resolution: 1280x720, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100090 Name : System preset: KindleFireHD8.9 Description : System preset: Kindle Fire HD 8.9 Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=4}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 5400, FrameRate: 30, Resolution: 1920x1080, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, } Id : 1351620000000-100100 Name : System preset: KindleFire Description : System preset: Kindle Fire Type : System Thumbnails : {Format: png, Interval: 60, Resolution: 192x108, AspectRatio: 16:9, } Video : {Codec: H.264, CodecOptions: {MaxReferenceFrames=3, Profile=main, Level=3.1}, KeyframesMaxDist: 90, FixedGOP: false, BitRate: 1600, FrameRate: 30, Resolution: 1024x576, AspectRatio: 16:9, } Audio : {Codec: AAC, SampleRate: 48000, BitRate: 160, Channels: 2, }
まとめ
エンコーディングという大量のリソースを使う地味な仕事をクラウドでちゃちゃっとやってくれるAmazon Elastic Transcoderによって、ユーザはよりビジネスにフォーカスしたアプリケーションの開発ができるようになりますね!!今のところ入力フォーマットに制限がありますが、スマホ時代には十分かなと思います!
参考資料
Getting Started with Elastic Transcoder